package proyecto2.src.aplicacion;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;

import proyecto2.src.controles.ControlOmega;
import proyecto2.src.controles.ControlTecladoPrincipal;
import proyecto2.src.entidades.Enemiga;
import proyecto2.src.entidades.entidad;
import proyecto2.src.municiones.MunicionX;

import java.util.Vector;

public class Juego extends JFrame {


	//atributos de instancia
	protected int cantBajas;
	protected int puntajeGlobal;
	protected boolean juegoCorriendo;
	protected Vector<Nivel> niveles;  
	protected Nivel nivelActual;
	protected ControlTecladoPrincipal controlDelTeclado;
	protected ControlOmega controlOmega;
	protected boolean jefeActivado;


	//atributos gráficos
	protected static final int width = 500;
	protected static final int height = 500;


	public Juego() {
		super("Proyecto X");
		cantBajas = 0;
		puntajeGlobal = 0;
		juegoCorriendo = true;
		jefeActivado = false;
		niveles = new Vector<Nivel>();		
		inicializarGUI();
	}


	private void inicializarGUI() {
		Container contenedor = this.getContentPane();	

		//creo una ventana centrada
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		Double anchoPantalla = screenSize.getWidth();
		Double altoPantalla = screenSize.getHeight();
		int auxAncho = (anchoPantalla.intValue() - width)/2;
		int auxAlto = (altoPantalla.intValue() - width)/2;
		this.setBounds(auxAncho, auxAlto, width, height);  
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


		//agrego componentes gráficas y modifico valores gráficos
		this.setVisible(true);
		this.setLayout(null);
		this.setResizable(false);



		//agrego un nivel
		Nivel primerNivel = new Nivel(this);
		niveles.add(primerNivel);
		contenedor.add(primerNivel);
		nivelActual = primerNivel;


		//Creación control del teclado
		controlDelTeclado = new ControlTecladoPrincipal(this);
		controlDelTeclado.setNave(nivelActual.obtenerNavePrincipal());
		this.addKeyListener(controlDelTeclado);


		//CONTROL OMEGA
		controlOmega = new ControlOmega(this);
		controlOmega.start();

		this.repaint();  
	}

	public void actualizarPuntaje(int puntaje) {
		puntajeGlobal += puntaje;
	}


	public void actualizarBajas() {
		cantBajas++;
	}


	public int getWidth() {
		return width;
	}


	public int getHeight() {
		return height;
	}

	public Nivel getNivelActual() {
		return nivelActual;
	}

	public void GameOver(){
		controlOmega.limpiarPantalla();
		juegoCorriendo = false;
	}


	public void agregarMunicion(MunicionX mun) {
		controlOmega.agregarMunicion(mun);
	}


	public void quitarMunicion(MunicionX mun) {
		controlOmega.eliminarMunicion(mun);
	}

	public void agregarEnemiga(Enemiga e) {
		controlOmega.agregarEnemiga(e);
	}


	public void quitarEnemiga(Enemiga e) {
		controlOmega.eliminarEnemiga(e);
	}


	public boolean obtenerJuegoCorriendo() {
		return juegoCorriendo;
	}


	public boolean calculoConEnemigas(MunicionX m){
		return controlOmega.controlarColicionNavesEnemigas(m);
	}
	
	public boolean calculoConPrincipal(MunicionX m){
		return controlOmega.controlarColicionNavePrincipal(m);
	}

	public void eliminarTodo(){
		controlOmega.limpiarPantalla();
	}
	
	//Se desactiva el uso de BombaDevastadora cuando se está peleando contra el jefe final para que no sea fácil ganar
	public void eliminarTodasLasNavesEnemigas(){
		if (!jefeActivado) {
			controlOmega.eliminarTodasLasEnemigas();
		}
	}

	//la razón para la sobrecarge es que para cada tipo de objeto realizamos un cálculo distinto
	public boolean estaFueraDePantalla(entidad n) {
		return (( n.getX() > getWidth() ) || (n.getX() < 0))||(( ( n.getY() > getHeight()+n.getHeight()+30) || (n.getY() < -500)));
	}


	public boolean estaFueraDePantalla(MunicionX n)	{
		return (( n.getX() > getWidth() ) || (n.getX() < 0))||(( ( n.getY() > getHeight()+n.getHeight() ) || (n.getY() < -n.getHeight())));
	}



	public void eliminarGraficamenteDelNivel(Component c) {
		nivelActual.eliminarGraficamente(c);
	}

	public void reinicio(){
		juegoCorriendo = false;
		this.dispose();
		Main.reiniciar();
	}
	
	public void activarJefe() {
		jefeActivado = true;
	}
}
